home *** CD-ROM | disk | FTP | other *** search
/ Internet 53 / INTERNET53.iso / mac / SOFTWARE / MAC / MAIL / EUDORA LIGHT / EUDORALIGHT3.13.HQX / epl313 / Extras / Dialup / srialpop.shar < prev   
Text File  |  1995-04-13  |  18KB  |  524 lines

  1. #! /bin/sh
  2. # This is a shell archive.  Remove anything before this line, then unpack
  3. # it by saving it into a file and typing "sh file".  To overwrite existing
  4. # files, type "sh file -c".  You can also feed this as standard input via
  5. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  6. # will see the following message at the end:
  7. #        "End of shell archive."
  8. # Contents:  README Makefile srialpop.c
  9. # Wrapped by acbhour@speelman on Mon Jun 21 12:48:39 1993
  10. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  11. if test -f 'README' -a "${1}" != "-c" ; then 
  12.   echo shar: Will not clobber existing file \"'README'\"
  13. else
  14. echo shar: Extracting \"'README'\" \(7010 characters\)
  15. sed "s/^X//" >'README' <<'END_OF_FILE'
  16. X
  17. X        S R I A L P O P -- POP over serial lines
  18. X        (sccs info README 1.4 93/06/21)
  19. X
  20. X        Author: Rudi van Houten <R.vanHouten@cc.ruu.nl>
  21. X                Ac.Comp.Centr.Utrecht (Netherlands)
  22. X        With thanks to:
  23. X                Steve Dorner <sdorner@qualcomm.com>
  24. X                Scott Hannahs <sth@slipknot.mit.edu>
  25. X                Mogen Trab Damsgaard <trab@kubism.ku.dk>
  26. X
  27. X        Version 1.0        11 dec '91
  28. X        Version 1.1        nov '92 (never released)
  29. X        Version 1.2        8 jun '93
  30. X    Version 1.3        15 jun '93
  31. X
  32. X    The Macintosh POPmail client Eudora offers a possibility
  33. X    to perform the POP and SMTP conversations over a serial
  34. X    (dialup) connection. Therefore is needed a 'psuedo-account'
  35. X    on a machine where Eudora can login. That account must have
  36. X    permission to execute senndmail and popper, not only local
  37. X    but also remote (via rsh) on all machines where a popserver
  38. X    or smtpserver must be contacted. Eudora is secretive with
  39. X    the password while showing its progress (if properly
  40. X    configured), but nobody can prevent a curious Macontosh
  41. X    owner from looking with ResEdit (or alike's). It can be a
  42. X    security leak.
  43. X    The same considerations apply to the IBM-PC client NUPop
  44. X    that also can use serial tty-lines to acquire mail.
  45. X    
  46. X    This program srialpop is written to take care of these
  47. X    trade off's. It must be used as the pseudo-account's
  48. X    loginshell. The commands which are recognized by the
  49. X    program are 'logout' and 'exit' (to finish the session
  50. X    of course) and 'telnet <host> <port> ...' which performs
  51. X    a TCP/IP connection with the indicated host/port. The
  52. X    supplied portnumber is checked against a list of valid
  53. X    portnumbers (now only POP and SMTP).
  54. X    All other commands cause an exit with errormessage.
  55. X    
  56. X    So the pseudo-account doesn't need permissions to run
  57. X    popper and sendmail, neither needed are permissions to
  58. X    run rsh to another machine or let another machine rsh
  59. X    in. And a diligent POPmail user who tries to login on
  60. X    the psuedo-account will discover that there is no fun.
  61. X    
  62. X    The program is straightforward and rather simple, and
  63. X    it is free. Yet I claim a copyright, with which I mean
  64. X    that anybody who feels a need to change (parts of) this
  65. X    program is under the obligation to document the changes
  66. X    and the need thereof in the program distribution files.
  67. X    Neither may this program be selled (as if anybody would
  68. X    buy this gadget), or distributed for a fee that extends
  69. X    a reasonable retribution for the 8k it occupies on disk
  70. X    or other media (I don't ask money, why should you).
  71. X    I have tested the program for some time now and found no
  72. X    bugs/problems. That doeesn't mean of course there are not.
  73. X    I offer this program free for everyone to use because I
  74. X    think it can be useful and is less dangerous then the
  75. X    shellscript originally suggested by Steve Dorner. But if
  76. X    you stumble over an error I am in no way responsible for
  77. X    the damage that can cause, however I don't expect disasters.
  78. X    I should welcome (by email) any notification of changes,
  79. X    corrections and enhancements in the form of the new program
  80. X    source or a diff.
  81. X
  82. X    At A.C.C.U. we rent POP mailboxes to users as a special cheap
  83. X    service. The users who obtain that service can only use email
  84. X    via the POP/SMTP mechanism. The owner of a POPmail account
  85. X    can not do any work on the UNIX machine, only change his/her
  86. X    password (their login shell is a script that consists of a
  87. X    call to /bin/passwd), and they don't need a home directory.
  88. X    Hence the service can be cheap.
  89. X
  90. X    The passwd entry for pseudo-user srialpop is:
  91. X    (splitted for layout reasons)
  92. X    srialpop:passwd:uid:gid:POP dialup dummy account:\
  93. X                        /home/srialpop:/home/srialpop/srialpop
  94. X
  95. X    The passwd entry for a POPmail account:
  96. X    popuser:passwd:uid:gid:POPmailuser:/home/srialpop:/usr/local/etc/chpw
  97. X
  98. X    And the script /usr/local/etc/chpw used as their loginshell:
  99. X    #!/bin/sh
  100. X    exec /bin/passwd
  101. X
  102. X    (Or place /bin/passwd as "loginshell" in /etc/passwd)
  103. X    
  104. X    Rudi van Houten  <rudi@cc.ruu.nl>
  105. X    Ac.Comp.Centr.Utrecht
  106. X    Budapestlaan 6
  107. X    3584 CD Utrecht Netherlands
  108. X
  109. X    ********************
  110. X    Known bugs:
  111. X
  112. X    **NOTE for NUPop users **
  113. X    If srialpop is used the end-of-line indicator must be set
  114. X    to "^M^J" in the "Options -> Serial" menu of NUPop.
  115. X    ****
  116. X
  117. X    There are some quirks with end-of-line definitions.
  118. X    TCP/IP requires CR-LF (according to the RFC's), but I
  119. X    never encountered a TCP/IP connection that was not satisfied
  120. X    with only LF.
  121. X    Someone reported that his system produced and accepted an
  122. X    end-of-line consisting of LF-CR, I didn't save the mails and
  123. X    forgot the details.
  124. X    When using public datanet systems (as X.25 in Europe) there
  125. X    can be a problem that X.25 considers CR as end-of-packet and
  126. X    the LF that is sent thereafter by the UNIX-system or POP-client
  127. X    is then considered as the start of a new packet, that never is
  128. X    closed. When I will have some time to spare I will look at that,
  129. X    but perhaps someone else will find a solution earlier (I expect
  130. X    it can be solved by setting appropriate LF-CR translations in
  131. X    srialpop and defining a single CR as end-of-line in Eudora/NUPop).
  132. X
  133. X
  134. X    Program history:
  135. X    9 dec 91   original version, only installed at ACCU
  136. X               The distribution contains one file 'srialpop.c'
  137. X    11 dec 91  some changes in IO-handling after Steve Dorner
  138. X               viewed the program and made some sugeestions
  139. X    - V1.0-
  140. X    18 aug 92  added port 105 for PH service
  141. X    20 Oct 92  changes for conditional compilation on Silicon
  142. X               Graphics sent in by Scott Hannahs
  143. X               <sth@slipknot.mit.edu>
  144. X    - V1.1-
  145. X    22 Nov 92  added a wait time before exit to satisfy the
  146. X               Macintosh CTB Hayes Modem Tool.
  147. X               added port 106 for password service
  148. X           Introduce the use of a make to enable simple
  149. X           definitions of symbols.
  150. X    14 dec 92  added exclusion of tab expansion
  151. X               (Mogen Trab Damsgaard <trab@kubism.ku.dk>)
  152. X    - V1.2-
  153. X    8 June 93  now change the terminal settings for the whole
  154. X           life of the program. Read the commands in blocks
  155. X           of one character and do the echo from the program.
  156. X    - V1.3-
  157. X    15 June 93 V1.2 did send the second character of CR-LF (or 
  158. X           LF-CR) line-end from the telnet command to the
  159. X           connected server via the socket. This character
  160. X           is now catched and thrown away. Some popservers
  161. X           couldn't handle this, but I didn't see this
  162. X           since popper did not have troubles.
  163. X
  164. XThis version of srialpop has been successfully tested on:
  165. XConvex OS 10.1
  166. XDEC (Philips) P9070 ATT SYS V/68 R3V6
  167. X
  168. XOn the next systems it compiles OK and seems to work when the
  169. Xtty-session is emulated on keyboard input via a telnet login, but
  170. Xit has NOT been actually tried out.
  171. XSGI IRIX System V.3
  172. XSUN SPARC OS 4.1.3
  173. END_OF_FILE
  174. if test 7010 -ne `wc -c <'README'`; then
  175.     echo shar: \"'README'\" unpacked with wrong size!
  176. fi
  177. # end of 'README'
  178. fi
  179. if test -f 'Makefile' -a "${1}" != "-c" ; then 
  180.   echo shar: Will not clobber existing file \"'Makefile'\"
  181. else
  182. echo shar: Extracting \"'Makefile'\" \(1689 characters\)
  183. sed "s/^X//" >'Makefile' <<'END_OF_FILE'
  184. X# Version 1.1  Makefile 1.4 93/06/21
  185. X#
  186. X# Makefile to compile and install srialpop
  187. X# the installation will place the program in the directory defined
  188. X# with symbol DEST, default the home directory of the user ${SRIALPOP}.
  189. X# Also a .hushlogin, .cshrc, .login and .profile are created there.
  190. X# The user ${SRIALPOP} is asumed to be configured to login with
  191. X# the program srialpop as "loginshell".
  192. X
  193. X#DEST=        /home/srialpop
  194. XDEST=        /usr/people/local/srialpop
  195. XSRIALPOP=    srialpop
  196. XGROUP=        mailusr
  197. X
  198. X# use this on Convexes and Suns:
  199. X#DEFS=
  200. X#LDFLAGS=
  201. X# use this on Silicon Graphics IRIX systems:
  202. XDEFS=    -DSYSV -ansi
  203. XLDFLAGS= -lc_s -s
  204. X# use this on not above mentioned Unix System V (e.g. ULTRIX, SysV/68)
  205. X#DEFS=    -DSYSV
  206. X#LDFLAGS=
  207. X
  208. X# On some systems it can be needed to enable or disable some
  209. X# tty-flags (e.g. X-on/X-off). This can be done by defining
  210. X# the symbol EXTRATTYFLAGS on the next line and writing code
  211. X# in routine extrattyflags situated in file srialpop.c just
  212. X# after the __STDC__ declarations.
  213. X# The code that is there now sets X-on/X-off, but will not
  214. X# be used since EXTRATTYFLAGS is not defined.
  215. X#CFLAGS=    -O ${DEFS} -DEXTRATTYFLAGS
  216. XCFLAGS=    -O ${DEFS}
  217. X
  218. Xsrialpop:    srialpop.o
  219. X        ${CC} $? ${LDFLAGS} -o $@
  220. X
  221. Xinstall:    srialpop
  222. X        strip srialpop
  223. X        mv srialpop ${DEST}
  224. X        chgrp ${GROUP} ${DEST}/srialpop
  225. X        chmod 511 ${DEST}/srialpop
  226. X        touch ${DEST}/.hushlogin
  227. X        echo "exit" > ${DEST}/.login
  228. X        -ln ${DEST}/.login ${DEST}/.cshrc
  229. X        -ln ${DEST}/.login ${DEST}/.profile
  230. X        rm -f ${DEST}/.forward
  231. X        chmod 644 ${DEST}/.hushlogin ${DEST}/.login
  232. X
  233. Xclean:
  234. X        rm -f core srialpop *.o srialpop.shar
  235. X
  236. Xshar:        srialpop.shar
  237. X        shar README Makefile srialpop.c > srialpop.shar
  238. X
  239. Xsrialpop.shar:    README Makefile srialpop.c
  240. END_OF_FILE
  241. if test 1689 -ne `wc -c <'Makefile'`; then
  242.     echo shar: \"'Makefile'\" unpacked with wrong size!
  243. fi
  244. # end of 'Makefile'
  245. fi
  246. if test -f 'srialpop.c' -a "${1}" != "-c" ; then 
  247.   echo shar: Will not clobber existing file \"'srialpop.c'\"
  248. else
  249. echo shar: Extracting \"'srialpop.c'\" \(7122 characters\)
  250. sed "s/^X//" >'srialpop.c' <<'END_OF_FILE'
  251. X/*
  252. X
  253. X    S R I A L P O P  (POP over serial lines)
  254. X
  255. X    Author: Rudi van Houten <R.vanHouten@cc.ruu.nl>
  256. X        Ac.Comp.Centr.Utrecht (Netherlands)
  257. X    With thanks to:
  258. X        Steve Dorner <sdorner@qualcomm.com>
  259. X        Scott Hannahs <sth@slipknot.mit.edu>
  260. X        Mogen Trab Damsgaard <trab@kubism.ku.dk>
  261. X
  262. X    see the file README for an introduction and hints for installation
  263. X
  264. X*/
  265. Xstatic char sccsid[]= "@(#)srialpop.c    1.3";
  266. X
  267. X#define LOGOUTGRACE 3
  268. X/*
  269. X    this is the time to wait (seconds) after a logout command before
  270. X    actually breaking the connection
  271. X*/
  272. X
  273. X#include <stdio.h>
  274. X#include <signal.h>
  275. X#include <ctype.h>
  276. X#include <sys/types.h>
  277. X#include <sys/socket.h>
  278. X#include <netinet/in.h>
  279. X#include <netdb.h>
  280. X#include <string.h>
  281. X#ifdef SYSV
  282. X#define bcopy(a,b,c) memcpy(b,a,c)
  283. X#include <termio.h>
  284. X#else
  285. X#include <sgtty.h>
  286. X#endif
  287. X#if __STDC__==1
  288. X#include <stdarg.h>
  289. X#else
  290. X#include <varargs.h>
  291. X#endif
  292. X
  293. X#define CRLF "\r\n"
  294. X
  295. X#define iBuflen 512
  296. Xstatic char sBuf[iBuflen];
  297. X
  298. Xstatic short iValidPort[]=
  299. X        {25     /* SMTP */
  300. X        ,105    /* PH server */
  301. X        ,106    /* password server */
  302. X        ,109    /* POP2 */
  303. X        ,110    /* POP3 */
  304. X        };
  305. X#define iValidPortsCount sizeof(iValidPort)/sizeof(short)
  306. X
  307. X#ifdef SYSV
  308. Xstatic struct termio sTermHold, sTermCurr;
  309. X#else
  310. Xstatic struct sgttyb sTermHold, sTermCurr;
  311. X#endif
  312. X
  313. X#if __STDC__==1
  314. Xstatic void errorexit(char*, ... );
  315. Xvoid main(void);
  316. X# ifdef EXTRATTYFLAGS
  317. Xstatic void extrattyflags(void);
  318. X# endif
  319. X#endif
  320. X
  321. X#ifdef EXTRATTYFLAGS
  322. Xstatic void extrattyflags()
  323. X{
  324. X/*
  325. X * here code can be placed to add/clear extra flags in
  326. X * the tty discipline descriptions
  327. X * here is an example that Scott Hannahs used on SGI
  328. X */
  329. XsTermCurr.c_iflag |= (IXON | IXOFF);
  330. Xreturn;
  331. X} /* void extrattyflags */
  332. X#endif
  333. X
  334. X#if __STDC__==1
  335. Xstatic void errorexit(char *sFormat, ...)
  336. X{
  337. X#else
  338. Xstatic void errorexit(va_alist) va_dcl
  339. X{
  340. X    char *sFormat;
  341. X#endif
  342. X    va_list ap;
  343. X    fputs(CRLF,stderr);
  344. X#if __STDC__==1
  345. X    va_start(ap,sFormat);
  346. X#else
  347. X    va_start(ap);
  348. X    sFormat= va_arg(ap,char*);
  349. X#endif
  350. X    vfprintf(stderr,sFormat,ap);
  351. X    va_end(ap);
  352. X    fputs(CRLF,stderr);
  353. X#ifdef SYSV
  354. X    ioctl(0,TCSETAF,&sTermHold);
  355. X#else
  356. X    ioctl(0,TIOCSETP,&sTermHold);
  357. X#endif
  358. X    sleep(1); exit(1);
  359. X} /* errorexit */
  360. X
  361. Xvoid main()
  362. X{
  363. Xint iSock, iPort, iChild;
  364. Xregister int i, l;
  365. Xstruct in_addr sInAddr;
  366. Xstruct sockaddr_in sServer;
  367. Xstruct hostent *psHost, *gethostbyname(), *gethostbyaddr();
  368. Xchar *psCommand, *psName, *psNumber;
  369. X
  370. X    /* get stty structure sTermHold */
  371. X#ifdef SYSV
  372. Xioctl(0,TCGETA,&sTermHold);
  373. X#else
  374. Xioctl(0,TIOCGETP,&sTermHold);
  375. X#endif
  376. Xbcopy(&sTermHold,&sTermCurr,sizeof(sTermCurr));
  377. X    /* and here prepare the line characteristics */
  378. X#ifdef SYSV
  379. XsTermCurr.c_iflag  &= ~(ICRNL | IXANY);
  380. XsTermCurr.c_oflag  &= ~OPOST;
  381. XsTermCurr.c_lflag  &= ~(ECHO | ICANON | ISIG );
  382. XsTermCurr.c_cc[VMIN] = 1;
  383. XsTermCurr.c_cc[VTIME] = 0;
  384. X#else
  385. XsTermCurr.sg_flags &= ~(ECHO | CRMOD | XTABS);
  386. XsTermCurr.sg_flags |= CBREAK;
  387. X#endif
  388. X#ifdef EXTRATTYFLAGS
  389. Xextrattyflags();
  390. X#endif
  391. X        /* set line characteristics to NOECHO, NOCRLF etc. */
  392. X#ifdef SYSV
  393. Xioctl(0,TCSETAF,&sTermCurr);
  394. X#else
  395. Xioctl(0,TIOCSETP,&sTermCurr);
  396. X#endif
  397. X
  398. X
  399. X/* this is the main loop, it reads the telnet or exit commandline */
  400. Xfor (;;)
  401. X{
  402. X    write(1,"%",1); l= 0;
  403. X    while(read(0,&sBuf[l],1) == 1 && sBuf[l] != '\n' && sBuf[l] != '\r')
  404. X    {
  405. X        write(1,&sBuf[l],1);
  406. X        if (++l >= iBuflen) errorexit("Too long commandline",0);
  407. X    }
  408. X    if (sBuf[l] == '\n' || sBuf[l] == '\r') sBuf[l]= '\0'; else sBuf[++l]= '\0';
  409. X    if (l == 0) continue;
  410. X    write(1,CRLF,2);
  411. X
  412. X    if (strcmp(sBuf,"logout") == 0
  413. X         || strcmp(sBuf,"exit") == 0
  414. X         || strcmp(sBuf,"quit") == 0
  415. X        )
  416. X        break; /* finished, logout now */
  417. X
  418. X            /* next loop splits the commandline in its constituents */
  419. X    i= 0; psCommand= psName= psNumber= NULL;
  420. X    while (i < l && psNumber == NULL)
  421. X    {
  422. X        while (isspace(sBuf[i])) i++;
  423. X        if (i >= l) break;
  424. X        if (psCommand == NULL) psCommand= &sBuf[i]; /* command found */
  425. X        else
  426. X        if (psName == NULL) psName= &sBuf[i];       /* argument 1 */
  427. X        else psNumber= &sBuf[i];                    /* argument 2 */
  428. X        do { i++; } while (!isspace(sBuf[i]) && i < l);
  429. X        sBuf[i++]= '\0';        /* terminator after last argument */
  430. X    }
  431. X    /* now we have a command (telnet) with two
  432. X       arguments (1=host 2=portnumber) */
  433. X
  434. X    if (strcmp(psCommand,"telnet"))
  435. X        errorexit("Sorry, don't know '%s'\n",psCommand);
  436. X                    /* telnet is the only known command */
  437. X
  438. X    if (psName == NULL || psNumber == NULL)
  439. X        errorexit("Sorry, hostname or portnumber missing\n",0);
  440. X                        /* and both host and port are required */
  441. X
  442. X    if (l= strlen(psNumber))
  443. X    {
  444. X        for (i= 0; i < l; i++)
  445. X            if (!isdigit(psNumber[i]))
  446. X                errorexit("Portnumber (%s) not numeric\n",psNumber);
  447. X        iPort= atoi(psNumber);
  448. X    }
  449. X    else iPort= 0;
  450. X
  451. X                        /* check validity of portnumber */
  452. X    for (i=0; iPort != iValidPort[i]; i++)
  453. X        if (i == iValidPortsCount)
  454. X            errorexit("Sorry, %d is not a valid port\n",iPort);
  455. X
  456. X        /*
  457. X           (unsigned long)(-1) = 0xffffffff, returnvalue
  458. X           from inet_addr() if illegal address passed through.
  459. X           I assume then it is a domain name.
  460. X           Thanks to Edwin Kremer (edwin@cs.ruu.nl) for the trick
  461. X        */
  462. X    if ((sInAddr.s_addr= inet_addr(psName)) == 0xffffffff)
  463. X        psHost= gethostbyname(psName);
  464. X    else
  465. X        psHost= gethostbyaddr((char*)&sInAddr,sizeof(struct in_addr),AF_INET);
  466. X    if (psHost == 0)
  467. X        errorexit("Cannot find server %s (host unknown)\n",psName);
  468. X    
  469. X        /* create socket */
  470. X    if ((iSock= socket(AF_INET,SOCK_STREAM,0)) < 0)
  471. X        { perror("Cannot open IP socket"); exit(1); }
  472. X
  473. X        /* fill socket structure .....*/
  474. X    sServer.sin_family= AF_INET;
  475. X    bcopy(psHost->h_addr,&(sServer.sin_addr),psHost->h_length);
  476. X    sServer.sin_port= htons(iPort);
  477. X    
  478. X        /*........and connect */
  479. X    if (connect(iSock,&sServer,sizeof(sServer)) < 0)
  480. X        { perror("connecting stream socket"); exit(1); }
  481. X
  482. X        /* now fork a child to copy stdin to socket */
  483. X    iChild= fork();
  484. X    if (iChild < 0) { perror("Cannot fork"); exit(1); }
  485. X    if (iChild == 0)
  486. X    { /* the child copies stdin to the socket */
  487. X        close(1); close(2); /* now close stdout and stderr */
  488. X        if (read(0,sBuf,1) == 1)
  489. X        {
  490. X            if (sBuf[0] != '\r' && sBuf[0] != '\n') write(iSock,sBuf,1);
  491. X            while ((l= read(0,sBuf,iBuflen)) > 0) write(iSock,sBuf,l);
  492. X        }
  493. X        close(0); exit(0);
  494. X    } /* if (iChild == 0) */
  495. X    /* no else part, child does exit
  496. X       the parent copies the socket to stdout
  497. X    */
  498. X    while ((l= read(iSock,sBuf,iBuflen)) > 0) write(1,sBuf,l);
  499. X    close(iSock);
  500. X
  501. X    kill(iChild,SIGTERM); /* superfluous */
  502. X
  503. X} /* main loop */
  504. X
  505. X        /* reset line characteristics */
  506. X#ifdef SYSV
  507. Xioctl(0,TCSETAF,&sTermHold);
  508. X#else
  509. Xioctl(0,TIOCSETP,&sTermHold);
  510. X#endif
  511. X
  512. Xsleep(LOGOUTGRACE); /* wait to satisfy Mac's Hayes Modem Tool */
  513. Xclose(0); close(1); close(2);
  514. Xexit(0);
  515. X} /* main */
  516. END_OF_FILE
  517. if test 7122 -ne `wc -c <'srialpop.c'`; then
  518.     echo shar: \"'srialpop.c'\" unpacked with wrong size!
  519. fi
  520. # end of 'srialpop.c'
  521. fi
  522. echo shar: End of shell archive.
  523. exit 0
  524.